package org.wiki.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/***
 * JDBC工具类，用于数据库相关操作。
 * @author Wiki.M
 * @version 0.1
 */
public class JdbcUtils {
	
	//数据库连接信息，可以忽略，已写入配置文件
	private static String url = "jdbc:mysql://localhost:3306/jdbc";

	private static String username = "root";

	private static String password = "wiki";

	private static JdbcUtils jdbcUtils = null;//JDBC用户类实例对象

	/**
	 * 加载数据库驱动，初始化连接数据库的相关属性。
	 */
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		//利用properties配置文件加载相关配置。
		Properties prop = new Properties();
		InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream(
				"jdbc.properties");
		try {
			prop.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		url =prop.getProperty("jdbc_url");
		username = prop.getProperty("username");
		password = prop.getProperty("password");
	}

	/**
	 * 私有构造方法
	 */
	private JdbcUtils() {
	}

	/**
	 * 获取JdbcUtils对象示例，单例
	 * @return 返回JdbcUtils对象实例
	 */
	public static JdbcUtils getInstance() {
		if (jdbcUtils == null) {
			synchronized (JdbcUtils.class) {
				if (jdbcUtils == null) {
					jdbcUtils = new JdbcUtils();
					return jdbcUtils;
				}
			}
		}
		return jdbcUtils;
	}

	/**
	 * 创建数据库连接
	 * @return 返回Connection对象实例
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 释放数据库操作资源
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void clear(Connection conn, Statement st, ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {

		}
	}
}